package jmine.tec.services.api;

/**
 * Ações possíveis para os serviços.<br/>
 * As ações dão suporte claro a operações genéricas presentes em todo sistema, como<br/>
 * CRUD, validações, ações e pré-requisitos para execução de serviços.<br/>
 * Não devem ser criados verbos específicos para ações de um sistema. Ao invés disso, deve-se usar a ação EXECUTAR. Desta forma, é possível
 * criar serviços com nomes naturais como EXECUTAR Processamento, EXECUTAR Liquidacao sem a necessidade de adicionar um verbo específico do
 * sistema a esta enumeração.
 * 
 * @author Rafael Volpato
 * @created Jun 4, 2007
 */
public enum ActionsEnum {

    /**
     * Ação de serviços que identificam pre-requisitos para execução dos serviços seguintes. Validação cuja falha deve ser considerada
     * impeditiva. Não deve efetuar mudanças no sistema.
     */
    PRE_REQ(1),

    /**
     * Ação para serviços que incluem novas entidades no sistema, cadastros de novas entidades.
     */
    INCLUIR(1),

    /**
     * Ação para serviços que alteram entidades já cadastradas.
     */
    ALTERAR(1),

    /**
     * Ação para serviços que excluem entidades persistidas.
     */
    EXCLUIR(1),

    /**
     * Ação para serviços que validam o estado do sistema. Não devem possuir qualquer efeito colateral, e os serviços seguintes devem poder
     * continuar a ser executados independentemente do resultado da execução do serviço de ação VALIDAR. A execução com erro de validação
     * continuará a ser considerada como execução com falha.
     */
    VALIDAR(1),

    /**
     * Ação de serviços especializados em busca de entidades. Devem efetuar a busca e armazenar o resultado em uma referência, sem qualquer
     * outro efeito colateral.
     */
    BUSCAR(1),

    /**
     * Ação de serviços que executam ações específicas do sistema.
     */
    EXECUTAR(-1),

    /**
     * Ação definida quando o serviço lido não possui uma ação válida. Para uso exclusivo interno do sistema.
     */
    INVALIDA(1),

    /**
     * O enum PROCESSAR deve permitir um numero ilimitado de servicos por acao.
     */
    PROCESSAR(-1),

    /**
     * O enum CONFIRMAR deve permitir apenas um service por acao.<br/>
     * 
     * @deprecated Este é um verbo específico do Pegasus. Em implementações novas, utilize EXECUTAR.
     */
    @Deprecated
    CONFIRMAR(1),

    /**
     * O enum REGISTRAR deve permitir apenas um service por acao.<br/>
     * 
     * @deprecated Este é um verbo específico do Pegasus. Em implementações novas, utilize EXECUTAR.
     */
    @Deprecated
    REGISTRAR(1),

    /**
     * O enum LIQUIDAR deve permitir apenas um service por acao.<br/>
     * 
     * @deprecated Este é um verbo específico do Pegasus. Em implementações novas, utilize EXECUTAR.
     */
    @Deprecated
    LIQUIDAR(1),

    /**
     * O enum BATER representa a etapa de batimento de liquidacao.<br/>
     * 
     * @deprecated Este é um verbo específico do Pegasus. Em implementações novas, utilize EXECUTAR.
     */
    @Deprecated
    BATER(1),

    /**
     * O enum CONFERIR representa a etapa de conferencia da liquidacao<br/>
     * 
     * @deprecated Este é um verbo específico do Pegasus. Em implementações novas, utilize EXECUTAR.
     */
    @Deprecated
    CONFERIR(1);

    private int allowedServicesCount;

    /**
     * Construtor.
     * 
     * @param allowedServicesNumber quantidade de servicos que podem ser definidos para uma acao (durante a leitura do arquivo).
     */
    private ActionsEnum(int allowedServicesNumber) {
        this.allowedServicesCount = allowedServicesNumber;
    }

    /**
     * @return quantidade de servicos que data instancia do enum permite.
     */
    public int getAllowedServicesCount() {
        return this.allowedServicesCount;
    }

    /**
     * Verifica se a instancia da action e' um {@link ActionsEnum.PRE_REQ}.
     * 
     * @return <code>true</code> se a instancia da action e' um {@link ActionsEnum.PRE_REQ}, <code>false</code> caso contrario.
     */
    public boolean preReq() {
        return this.equals(PRE_REQ);
    }

    /**
     * Verifica se a instancia da action e' um {@link ActionsEnum.INCLUIR}.
     * 
     * @return <code>true</code> se a instancia da action e' um {@link ActionsEnum.INCLUIR}, <code>false</code> caso contrario.
     */
    public boolean incluir() {
        return this.equals(INCLUIR);
    }

    /**
     * Verifica se a instancia da action e' um {@link ActionsEnum.ALTERAR}.
     * 
     * @return <code>true</code> se a instancia da action e' um {@link ActionsEnum.ALTERAR}, <code>false</code> caso contrario.
     */
    public boolean alterar() {
        return this.equals(ALTERAR);
    }

    /**
     * Verifica se a instancia da action e' um {@link ActionsEnum.EXCLUIR}.
     * 
     * @return <code>true</code> se a instancia da action e' um {@link ActionsEnum.EXCLUIR}, <code>false</code> caso contrario.
     */
    public boolean excluir() {
        return this.equals(EXCLUIR);
    }

    /**
     * Verifica se a instancia da action e' um {@link ActionsEnum.VALIDAR}.
     * 
     * @return <code>true</code> se a instancia da action e' um {@link ActionsEnum.VALIDAR}, <code>false</code> caso contrario.
     */
    public boolean validar() {
        return this.equals(VALIDAR);
    }

    /**
     * Verifica se a instancia da action e' um {@link ActionsEnum.LIQUIDAR}.
     * 
     * @return <code>true</code> se a instancia da action e' um {@link ActionsEnum.LIQUIDAR}, <code>false</code> caso contrario.
     */
    @Deprecated
    public boolean liquidar() {
        return this.equals(LIQUIDAR);
    }

    /**
     * Verifica se a instancia da action e' um {@link ActionsEnum.PROCESSAR}.
     * 
     * @return <code>true</code> se a instancia da action e' um {@link ActionsEnum.PROCESSAR}, <code>false</code> caso contrario.
     */
    @Deprecated
    public boolean processar() {
        return this.equals(PROCESSAR);
    }

    /**
     * Verifica se a instancia da action e' um {@link ActionsEnum.CONFIRMAR}.
     * 
     * @return <code>true</code> se a instancia da action e' um {@link ActionsEnum.CONFIRMAR}, <code>false</code> caso contrario.
     */
    @Deprecated
    public boolean confirmar() {
        return this.equals(CONFIRMAR);
    }

    /**
     * Verifica se a instancia da action e' um {@link ActionsEnum.REGISTRAR}.
     * 
     * @return <code>true</code> se a instancia da action e' um {@link ActionsEnum.REGISTRAR}, <code>false</code> caso contrario.
     */
    @Deprecated
    public boolean registrar() {
        return this.equals(REGISTRAR);
    }

    /**
     * Verifica se a instancia da action e' um {@link ActionsEnum.BATER}.
     * 
     * @return <code>true</code> se a instancia da action e' um {@link ActionsEnum.BATER}, <code>false</code> caso contrario.
     */
    @Deprecated
    public boolean bater() {
        return this.equals(BATER);
    }

    /**
     * Verifica se a instancia da action e' um {@link ActionsEnum.CONFERIR}.
     * 
     * @return <code>true</code> se a instancia da action e' um {@link ActionsEnum.CONFERIR}, <code>false</code> caso contrario.
     */
    @Deprecated
    public boolean conferir() {
        return this.equals(CONFERIR);
    }

    /**
     * Verifica se o valor passado e' uma action valida.
     * 
     * @param value value
     * @return <code>true</code> se o valor passado for uma action valida, <code>false</code> caso contrario
     */
    public static boolean isValid(String value) {
        try {
            valueOf(value);
            return true;
        } catch (IllegalArgumentException e) {
            return false;
        }
    }
}